/* 
 * @moduleName: http.js
 * @Desc:二次封装axios
 * @Author: djkloop 
 * @Date: 2017-11-19 00:25:01 
 * @Last Modified by: djkloop
 * @Last Modified time: 2017-12-05 11:42:30
 */
/**
 * 前后端统一返回正确接口
 * ERROR_CODE : 1
 * ERROR_MESSAGE_FAILE : '查询失败...'
 * ERROR_MESSAGE_500 : '服务器以炸...'
 * ERROR_MESSAGE_NODATA: '前后端接口不一致...'
 * SUCCESS_CODE : 0
 * SUCCESS_MESSAGE_SAVE : '数据保存成功...'
 * SUCCESS_MESSAGE_FIND : '数据查询成功....'
 * SUCCESS_MESSAGE_UPDATE : '数据更新成功...'
 * 
 */
import axios from 'axios';
import qs from 'qs';
import NGProgress from 'nprogress'
import {notification} from 'antd';

const ERROR_CODE = 1;
const SUCCESS_CODE = 0;
const ERROR_MESSAGE_500 = '服务器出错...'
const ERROR_MESSAGE_PERMISSIONS= '前后端接口不一致...'


// 请求前触发
axios.interceptors.request.use(config => {
  // 发送前触发loading...
  NGProgress.start()
  return config
}, error => {
  return Promise.reject(error)
});

// 请求回来的时候些提前处理
axios.interceptors.response.use(response => {
  NGProgress.done()
  return response
}, error => {
  return Promise.resolve(error.response)
});
// 检查状态是不是等于200
function checkStatus(response) {
  // loading
  // 如果http状态码正常，则直接返回数据
  if(response && response.data.code === SUCCESS_CODE && response.status === 200) {
    return response
      // 如果不需要除了data之外的数据，可以直接 return response.data
  }
  // 异常状态下，把错误信息返回去
  return {
    code: ERROR_CODE,
    status: 500,
    message: ERROR_MESSAGE_500
  }
}
/**
 * checkCode if false return error code and return error meesage
 * 
 * @param {*} res 
 */
function checkCode(res) {
  // 如果code异常(这里已经包括网络错误，服务器错误，后端抛出的错误)，可以弹出一个错误提示，告诉用户
  if(res.status === 500) {
    notification.error({
      message: ERROR_MESSAGE_500,
      description: '请联系后台管理员或者稍后再进行查询操作...',
    });
  }
  // 这里是有数据但是 code码和前端不一致 抛出相对应的错误...
  if(res.data && (res.data.code !== SUCCESS_CODE)) {
    notification.error({
      message: ERROR_MESSAGE_PERMISSIONS,
      description: '请联系后台管理员获取相关权限在进行相关查询...',
    });
  }
  notification.success({
    message: res.data.message,
    description: `后台返回msg：${res.data.message}`,
  });
  return res
}
// 导出axios的最常用两个方法
export default {
  post(url, data, baseURL) {
    return axios({
      method: 'post',
      baseURL: baseURL || '',
      url,
      data: qs.stringify(data),
      timeout: 10000,
      headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
      }
    }).then(
      (response) => {
        return checkStatus(response)
      }).then(
      (res) => {
        return checkCode(res)
      })
  },
  get(url, params, baseURL) {
    return axios({
      method: 'get',
      baseURL: baseURL || '',
      url,
      params, // get 请求时带的参数
      timeout: 10000,
      headers: {
        'X-Requested-With': 'XMLHttpRequest'
      }
    }).then(
      (response) => {
        // 请求到先检查 status状态 如果出错 直接在这里处理把错误返回给相对应的组件
        return checkStatus(response)
      }).then(
      (res) => {
        // 再次检查前后端统一接口 code码 如果不统一 则再次把错误返回给相对应的组件
        return checkCode(res)
      })
  }
}